package sojupay

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"sort"
	"strings"
)

// GenerateSign 生成签名
func GenerateSign(p map[string]any, secret string) string {
	originStr := sortParameters(p)
	originStr += "&" + secret
	return MD5(originStr)
}

// sortParameters 参数升序排序并使用 QueryString 格式
func sortParameters(params map[string]any) string {
	// 返回升序排序切片
	s := sortMap(params)
	// 拼接成字符串
	var sortedParams []string
	for _, key := range s {
		// 过滤签名字段
		if key == "sign" {
			continue
		}
		// 过滤空字符串
		if t, ok := params[key].(string); ok && t == "" {
			continue
		}
		sortedParams = append(sortedParams, fmt.Sprintf("%s=%s", key, params[key]))
	}
	return strings.Join(sortedParams, "&")
}

// sortMap 对 map 的 key 排序
func sortMap(p map[string]any) (keys []string) {
	for key := range p {
		keys = append(keys, key)
	}
	sort.Strings(keys)
	return
}

// MD5 加密和验签
func MD5(originStr string) string {
	// 使用 MD5 进行哈希
	hash := md5.Sum([]byte(originStr))
	// 将哈希值转换为16进制字符串
	return hex.EncodeToString(hash[:])
}
